//[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
/**
 *
 *	@file		blact.h
 *	@brief		ビルボードアクター
 *	@author		tomoya takahashi
 *	@data		2005.10.05
 *
 */
//]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
#ifndef __BLACT_H__
#define __BLACT_H__


#include <nnsys.h>
#include "vram_transfer_anm.h"
#include "tcb.h"
#include "res_manager.h"

#undef GLOBAL
#ifdef	__BLACT_H_GLOBAL
#define	GLOBAL	/* */
#else
#define	GLOBAL	extern
#endif

//-----------------------------------------------------------------------------
/**
 *					定数宣言
 */
//-----------------------------------------------------------------------------
//-------------------------------------
//	アクターヘッダーデータ用
//=====================================
#define		BLACT_ANIME_TABLE_MAX (10)		// アニメーションオフセット数最大


//-------------------------------------
//	ビルボードアクター動作構造体の状態
//
//	そのビルボードアクターが
//	どんな動作をしているか
//
//	BLACT_GetState()関数で取得できます
//=====================================
enum
{
	BLACT_MOVE_NONE,			// データなし
	BLACT_MOVE_INIT,			// 初期化中
	BLACT_MOVE_VRAM,			// Vram転送稼動中
	BLACT_MOVE_NORM,			// 常駐アニメ稼動中
};

//-------------------------------------
//
//	アニメーションコマンド
//
//	BLACT_ANIME_TBL構造体
//	アニメーションテーブルのアニメーションタイプです
//
//=====================================
enum{
	BLACT_ANIM_LOOP,		// ループ再生
	BLACT_ANIM_END,			// １回再生
	BLACT_ANIM_CMD_MAX
};

//-------------------------------------
//
//	アニメーション状態戻り値
//
//	BLACT_AnmFrameChg関数の戻り値
//=====================================
enum{
	BLACT_ANISTA_LOOP,	// 再生中
	BLACT_ANISTA_END,	// 再生終了
};

//-------------------------------------
//
//	Vram転送アニメ指定字のVramkeyに入れる値
//
//
//	BLACT_HEADER構造体のtexKey tex4x4Key plttkey
//	に指定する定数
//=====================================
#define BLACT_TEXKEY_VRAMANM	(NNS_GFD_ALLOC_ERROR_TEXKEY)
#define BLACT_PLTTKEY_VRAMANM	(NNS_GFD_ALLOC_ERROR_PLTTKEY)

//-----------------------------------------------------------------------------
/**
 *					構造体宣言
 */
//-----------------------------------------------------------------------------
//-------------------------------------
//
//	アニメーションテーブル構造体
//
//=====================================
typedef struct {
	int start;		// 開始フレーム
	int end;		// 終了フレーム
	int cmd;		// 動作コマンド
} BLACT_ANIME_TBL;


//-------------------------------------
//
//	ビルボードヘッダーデータ
//
//=====================================
typedef struct{
	void*  ImdRes;						//ビルボードモデルリソース
	const NNSG3dResTex*  ItxRes;		//アニメーションパターンテクスチャーリソース
//	int  flag;							//予備のフラグ
	const BLACT_ANIME_TBL* anm;			// アニメーションテーブル
	TEXANM_DATATBL texanm;				// テクスチャアニメーションデータテーブル

	// 常駐アニメのときは下にポインタを代入
	// Vram転送の時は
	//		BLACT_TEXKEY_VRAMANM	（テクスチャキー用）
	//		BLACT_PLTTKEY_VRAMANM	（パレットキー用）
	//	を指定する
	NNSGfdTexKey	texKey;		// 使用するテクスチャキー
	NNSGfdTexKey	tex4x4Key;	// 使用するテクスチャキー
	NNSGfdPlttKey	plttKey;	// 使用するパレットキー
}BLACT_HEADER;

//-------------------------------------
//
//	ビルボードアクターワークポインタ
//	隠蔽
//
//=====================================
typedef struct BLACT_WORK_tag* BLACT_WORK_PTR;
typedef const struct BLACT_WORK_tag* CONST_BLACT_WORK_PTR;

//-------------------------------------
//
//	ビルボードアクターセットポインタ
//	隠蔽
//
//=====================================
typedef struct _BLACT_SET* BLACT_SET_PTR;
typedef const struct _BLACT_SET* CONST_BLACT_SET_PTR;

//-------------------------------------
//	ビルボードアクター
//		初期化構造体
//=====================================
typedef struct{
	int	WorkNum;				// 動作構造体数
	int heap;					// 使用ヒープ
}BLACT_SETDATA;

//-------------------------------------
//	ビルボードアクター
//		アッドデータ構造体
//=====================================
typedef struct{
	BLACT_SET_PTR	blact_s;		// ビルボードアクターセット
	const BLACT_HEADER* pHeader;	// ビルボードアクターヘッダー
	VecFx32		matrix;				// 座標
	VecFx32		scale;				// 拡大値
}BLACT_ADD;

//-------------------------------------
//
//	ビルボードアクター描画登録関数型
//
//=====================================
typedef void (*BLACT_DRAW_BEFORE_PROC)(BLACT_WORK_PTR,void*);


//----------------------------------------------------------------------------
/**
 *					プロトタイプ宣言
 */
//-----------------------------------------------------------------------------
//=============================================================================
//
//		ビルボードアクターシステム操作関数郡
//
//		ビルボードアクターのシステムを操作する関数
//=============================================================================
//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクターシステムの初期化
 *
 *	@param	ContNum			管理ビルボードアクターセット数
 *	@param	heap			使用ヒープ
 *
 *	@return none
 *
 * ビルボードアクター使用前に１度実行
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_InitSys( int ContNum, int heap );

//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクターシステムの破棄
 *
 *	@param	none
 *
 *	@return none
 *
 * ビルボードアクター使用後に１度必要
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_DestSys( void );

//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクターシステムの描画
 *
 *	@param	none
 *
 *	@return none
 *
 * 登録されているビルボードアクターセットを描画します。
 *
 * 描画したくないときは
 *		BLACT_SET構造体のDrawFlag を0にする
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_DrawSys( void );

#if 0	//BLACT_DelObjRefCheck 反映されているかチェックをするなど行うために廃止
//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクター単体の描画
 *
 *	@param	act	BLACT_WORK_PTR
 *
 *	@return none
 *
 * 指定したビルボードアクターセットを描画します。
 *
 * 描画したくないときは
 *		BLACT_SET構造体のDrawFlag を0にする
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_Draw(BLACT_WORK_PTR act);
#endif

//=============================================================================
//
//		ビルボードアクターセット操作関数郡
//
//=============================================================================
//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクターセット設定
 *
 *	@param	pSetData		アクターセット情報
 *
 *	@retval	BLACT_SET_PTR	アクターセットポインタ
 *	@retval	NULL			登録失敗
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL BLACT_SET_PTR BLACT_InitSet( const BLACT_SETDATA* pSetData );

//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクターセット破棄
 *
 *	@param	bl_set			アクターセットポインタ
 *
 *	@retval	TRUE			成功
 *	@retval	FALSE			失敗
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL BOOL BLACT_DestSet( BLACT_SET_PTR bl_set );

//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクターセット描画フラグを設定
 *
 *	@param	bl_set			アクターセットポインタ
 *	@param	flag			設定するフラグ値	0:非描画 1:描画
 *
 *	@retval	TRUE			成功
 *	@retval	FALSE			失敗
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL BOOL BLACT_DrawFlagSet( BLACT_SET_PTR bl_set, u8 flag );

//----------------------------------------------------------------------------
/**
 *
 *@brief	ビルボードアクターセットの描画フラグを取得
 *
 *@param	bl_set		アクターセットポインタ
 *
 *@return	u8			1:描画		0:非描画
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL u8 BLACT_DrawFlagGet( CONST_BLACT_SET_PTR bl_set );

//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクターセットの全ビルボード破棄
 *
 *	@param	bl_set			アクターセットポインタ
 *
 *	@retval	TRUE			成功
 *	@retval	FALSE			失敗
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL BOOL BLACT_DeleteWorkAllSet( BLACT_SET_PTR bl_set );

//----------------------------------------------------------------------------
/**
 *	@brief	破棄したオブジェクトがまだ画面に反映されているかチェック
 *
 *	@param	bl_set	アクターセット
 *
 *	@retval	TRUE	反映されている
 *	@retval	FALSE	反映されていない
 */
//-----------------------------------------------------------------------------
GLOBAL BOOL BLACT_DelObjRefCheck( BLACT_SET_PTR bl_set );

//----------------------------------------------------------------------------
/**
 *	@brief	ビルボードアクターVブランク処理
 *
 *	@param	act		ワーク
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_VBlankFunc( BLACT_SET_PTR bl_set );


//=============================================================================
//
//		ビルボードアクターワーク操作関数
//
//		ビルボードアクターの個々を操作する関数
//=============================================================================
//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクターの追加
 *
 *	@param	add		ビルボードアクター登録データ
 *
 *	@retval BLACT_WORK_PTR	登録したワークのポインタ
 *	@retval	NULL			失敗
 *
 *	＊常駐アニメのとき
 *		すぐ動作、描画が開始します。
 *
 *	＊Vram転送アニメのとき
 *		ここではBLACT_DATACHG配列にデータを設定するだけで、
 *		実際に動作、描画が開始するのはBLACT_AfterDrawSys()関数
 *		を呼んだ後になります。
 */
//-----------------------------------------------------------------------------
GLOBAL BLACT_WORK_PTR BLACT_Add( const BLACT_ADD* add );

//-----------------------------------------------------------------------------
/**
 *
 *	@brief	アニメーションセットを変える
 *
 *
 *	@param	act			チェンジする動作配列
 *	@param	header		チェンジするアニメーションヘッダー
 *
 *	@return none
 *
 *	＊常駐アニメのとき
 *		すぐ動作、描画が開始します。
 *
 *	＊Vram転送アニメのとき
 *		ここではBLACT_DATACHG配列にデータを設定するだけで、
 *		実際に動作、描画が開始するのはBLACT_AfterDrawSys()関数
 *		を呼んだ後になります。
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_AnmSetChg( BLACT_WORK_PTR act, const BLACT_HEADER* header );

//----------------------------------------------------------------------------
/**
 *
 *
 *	@brief	常駐アニメ用　ビルボードアクターヘッダーデータ作成支援関数
 *
 *	@param	p_header		ビルボードアクターヘッダーデータ格納先
 *	@param	p_imd			ビルボードモデルリソース
 *	@param	cp_itx			アニメーションテクスチャリソース
 *	@param	cp_anm			アニメーションテーブル
 *	@param	cp_texanm		テクスチャアニメーションデータテーブル
 *	@param	texkey			テクスチャキー
 *	@param	tex4x4key		4x4圧縮テクスチャキー
 *	@param	plttkey			パレットキー
 *
 *	@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_MakeHeaderNormalAnm( BLACT_HEADER* p_header, void* p_imd, const NNSG3dResTex* cp_itx, const BLACT_ANIME_TBL* cp_anm, const TEXANM_DATATBL* cp_texanm, NNSGfdTexKey texkey, NNSGfdTexKey tex4x4key, NNSGfdPlttKey plttkey  );

//----------------------------------------------------------------------------
/**
 *
 *	@brief	Vram転送アニメ用　ビルボードアクターヘッダーデータ作成支援関数
 *
 *	@param	p_header		ビルボードアクターヘッダーデータ格納先
 *	@param	p_imd			ビルボードモデルリソース
 *	@param	cp_itx			アニメーションテクスチャリソース
 *	@param	cp_anm			アニメーションテーブル
 *	@param	cp_texanm		テクスチャアニメーションデータテーブル
 *
 *	@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_MakeHeaderVramAnm( BLACT_HEADER* p_header, void* p_imd, const NNSG3dResTex* cp_itx, const BLACT_ANIME_TBL* cp_anm, const TEXANM_DATATBL* cp_texanm );

//-----------------------------------------------------------------------------
/**
 *
 *	@brief	ビルボードアクターの削除
 *
 *	@param	del		破棄するビルボードアクター動作構造体
 *
 *	@retval	TRUE	成功(BOOL型：削除に成功したか)
 *	@retval	FALSE	失敗
 *
 *	ビルボードアクターのステータスが
 *		BLACT_MOVE_INIT
 *	の時は初期化処理中のため破棄出来ません。
 *
 *	このステータスにはVram転送アニメモードで登録後なり、
 *	BLACT_AfterDrawSys()関数が実行されるとステータスが
 *		BLACT_MOVE_VRAM
 *	になります。このステータスになったら破棄できます。
 *
 * BLACT_GetState()関数でステータスは取得できます。
 *
 */
//-----------------------------------------------------------------------------
GLOBAL BOOL BLACT_Delete( BLACT_WORK_PTR del );

//----------------------------------------------------------------------------
/**
 *	@brief	ビルボードアクターワークのポインタを取得
 *
 *	@param	set			ビルボードアクターセット
 *	@param	num			ビルボードアクターワークインデックス
 *
 *	@retval BLACT_WORK_PTR	ビルボードアクターワーク
 *	@retval	NULL		そのインデックスのワークは無い
 *
 */
//-----------------------------------------------------------------------------
GLOBAL	BLACT_WORK_PTR BLACT_WorkGet( CONST_BLACT_SET_PTR set, int num );

//-----------------------------------------------------------------------------
/**
 *	@brief	BLACT_WORK構造体型データ　クリア
 *
 *	@param	pDat	BLACT_WORK構造体型データへのポインタ
 *	@return none
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_WorkClear( BLACT_WORK_PTR pDat );

//----------------------------------------------------------------------------
/**
 *
 *	@brief	座標を設定
 *
 *	@param	act		設定するアクター
 *	@param	mat		設定する座標
 *
 *	@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_MatrixSet( BLACT_WORK_PTR act, const VecFx32* mat );

//----------------------------------------------------------------------------
/**
 *
 *	@brief	座標を取得
 *
 *	@param	act		取得するアクター
 *
 *	@return	const VecFx32*	座標
 *
 */
//-----------------------------------------------------------------------------
GLOBAL const VecFx32* BLACT_MatrixGet( CONST_BLACT_WORK_PTR act );

//----------------------------------------------------------------------------
/**
 *
 *	@brief	拡大値を設定する
 *
 *	@param	act		設定するアクター
 *	@param	sca		設定する拡大値
 *
 *	@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_ScaleSet( BLACT_WORK_PTR act, const VecFx32* sca );

//----------------------------------------------------------------------------
/**
 *
 *	@brief	拡大値を取得する
 *
 *	@param	act		取得するアクター
 *
 *	@return	const VecFx32*	拡大値
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL const VecFx32* BLACT_ScaleGet( CONST_BLACT_WORK_PTR act );

//----------------------------------------------------------------------------
/**
 *
 *@brief	参照回転行列を設定
 *
 *@param	act		設定するアクター
 *@param	rot		参照する回転行列 NULL=非参照
 *
 *@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_pRotateSet(BLACT_WORK_PTR act, const MtxFx33 *rot );

//----------------------------------------------------------------------------
/**
 *
 *@brief	参照回転行列を取得
 *
 *@param	act		取得するアクター
 *
 *@return	const MtxFx33*	参照している回転行列 NULL=非参照
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL const MtxFx33* BLACT_pRotateGet(CONST_BLACT_WORK_PTR act);

//----------------------------------------------------------------------------
/**
 *
 *	@brief	描画フラグを設定する
 *
 *	@param	act		設定するアクター
 *	@param	flag	描画フラグ	1:描画	0:非描画
 *
 *	@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_ObjDrawFlagSet( BLACT_WORK_PTR act, u8 flag );

//----------------------------------------------------------------------------
/**
 *
 *	@brief	描画フラグを取得する
 *
 *	@param	act		取得するアクター
 *
 *	@return	u8		1:描画	0:非描画
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL u8 BLACT_ObjDrawFlagGet( CONST_BLACT_WORK_PTR act );


//-----------------------------------------------------------------------------
/**
 *
 *	@brief	アニメーションオフセットを変更
 *
 *	@param	act		チェンジする動作配列
 *	@param	num		セットするアニメーションオフセットナンバー
 *
 *	@return	none
 *
 * 実際に絵が変わるのはアニメーションフレームを変更したときです。
 *
 * アニメーションオフセットを変更したその瞬間に絵が変わる関数
 *						BLACT_AnmOffsChgRef()
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_AnmOffsChg( BLACT_WORK_PTR act, int num );

//-----------------------------------------------------------------------------
/**
 *
 *	@brief	アニメーションオフセットを変更と同時に変更を画面に反映
 *
 *	@param	act		チェンジする動作配列
 *	@param	num		セットするアニメーションオフセットナンバー
 *
 *	@return	none
 *
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_AnmOffsChgRef( BLACT_WORK_PTR act, int num );

//----------------------------------------------------------------------------
/**
 *
 *	@brief	アニメーションオフセットを取得
 *
 *	@param	act		取得するアクター
 *
 *	@return	int		アニメーションオフセット
 *
 *
 */
//-----------------------------------------------------------------------------
GLOBAL int BLACT_AnmOffsGet( CONST_BLACT_WORK_PTR act );

//----------------------------------------------------------------------------
/**
 *	@brief	アニメーションフレームを動かす
 *						実際にアニメーションをループ再生するときに使用する
 *
 *	@param	act		アニメーションさせる動作配列
 *	@param	num		アニメーションスピード
 *
 *	@retval	BLACT_ANISTA_LOOP	再生中
 *	@retval	BLACT_ANISTA_END	再生終了
 */
//-----------------------------------------------------------------------------
GLOBAL int BLACT_AnmFrameChg( BLACT_WORK_PTR act, fx32 num );

//----------------------------------------------------------------------------
/**
 *	@brief	アニメーションフレーム数を設定
 *
 *	@param	act		アニメーションさせる動作配列
 *	@param	num		設定するフレーム数
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_AnmFrameSet( BLACT_WORK_PTR act, fx32 num );

//----------------------------------------------------------------------------
/**
 *	@brief	アニメーションフレーム数を取得
 *
 *	@param	act		アニメーションさせる動作配列
 *
 *	@return	fx32	アニメーションフレーム数
 */
//-----------------------------------------------------------------------------
GLOBAL fx32 BLACT_AnmFrameGet( CONST_BLACT_WORK_PTR act );

//----------------------------------------------------------------------------
/**
 *	@brief	オフセット開始フレームからのアニメーションフレーム数をセット
 *
 *	@param	act		アニメーションさせる動作配列
 *	@param	num		アニメーションスピード
 *
 *	@return	none
 *
 *	アニメーションオフセットの開始フレーム+numのフレームをセットします。
 *	左アニメなら左アニメの開始フレーム+numのフレームがセットされます。
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_AnmFrameSetOffs( BLACT_WORK_PTR act, fx32 num );

//----------------------------------------------------------------------------
/**
 *	@brief	オフセット開始フレームからのアニメーションフレーム数を取得
 *
 *	@param	act		アニメーションさせる動作配列
 *
 *	@return	fx32	アニメーションフレーム数
 *
 *	実フレーム数 - 現在のアニメーションオフセット開始フレームの値を返します
 *
 */
//-----------------------------------------------------------------------------
GLOBAL fx32 BLACT_AnmFrameGetOffs( CONST_BLACT_WORK_PTR act );

//----------------------------------------------------------------------------
/**
 *	@brief	IDのビルボードモデルリソースを取得
 *
 *	@param	pDat		モデルリソースを取得したいビルボードアクターワーク
 *
 *	@return NNSG3dResMdl* モデルリソース
 *
 *	最新のモデルリソースを取得します。
 *		・アニメーションセットの変更を行ったときは変更先のモデルリソースを取得します。
 *
 */
//-----------------------------------------------------------------------------
GLOBAL NNSG3dResMdl* BLACT_MdlResGet( CONST_BLACT_WORK_PTR pDat );

//----------------------------------------------------------------------------
/**
 *
 *	@brief	現在ビルボードアクターワークはどんな動作を行っているかを取得
 *
 *	@param	act		ビルボードアクターワーク
 *
 *	@retval	BLACT_MOVE_NONE			動作していない
 *	@retval BLACT_MOVE_INIT			初期化中
 *	@retval	BLACT_MOVE_VRAM			Vram転送稼動中
 *	@retval	BLACT_MOVE_NORM			常駐アニメ稼動中
 *
 */
//-----------------------------------------------------------------------------
GLOBAL int BLACT_GetState( CONST_BLACT_WORK_PTR act );


//-----------------------------------------------------------------------------
/**
*	各VramKeyアクセス関数です。
*		VramKeyを操作すれば、色を変えたり、テクスチャを変えたり出来ます。
*
*		VramKeyの取得は常駐アニメ、Vram転送アニメ両方使用することが出来ます。
*
*		VramKeyの設定は常駐アニメでしか使用できません。
*		また設定したVramKeyの解放処理などは外側で管理してください。
*
*		常駐アニメで色を変える時に一番よいと思う方法は
*			1:NNS_GfdAllocPlttVram()関数でNNSGfdPlttKeyを取得
*			2:NNSGfdPlttKeyのアドレスにパレットデータを転送
*				パレットデータは自分で用意してください。
*				転送はgflib/vram_transfer_manager.h のシステムを使ってください。
*			3:１回Vブランクを通る必要がある（パレットが転送される）
*			4:BLACT_SetPlttKey()関数でパレットキーを設定
*			*:色を変えるのをやめるときはNNS_GfdFreePlttVram()関数で
*			  NNSGfdPlttKeyの領域を破棄してください。
*
*		Vram転送アニメで色を変える時に一番よいと思う方法は
*			BLACT_GetPlttKeyで取得したVramKeyの
*			アドレスにグラフィックデータを転送する方法です。
*			しかし、フレームを動かして、グラフィックデータの変更が起こると
*			グラフィックデータをビルボードアクターが上書きしてしまいます。
*
*/
//-----------------------------------------------------------------------------
//----------------------------------------------------------------------------
/**
 *
 *	@brief	テクスチャキーの取得
 *
 *	@param	act ビルボードアクターワーク
 *
 *	@retval	テクスチャキー
 *	@retval	BLACT_TEXKEY_VRAMANM	ビルボードアクター初期化中
 *
 *	＊常駐アニメのときの注意点
 *		このVramアドレスにテクスチャデータを転送すれば、絵が変わりますが、
 *		同じVramアドレスを見ているオブジェクトの絵が全て変わってしまいます。
 *
 *	＊Vram転送アニメの時の注意点
 *		このVramアドレスにテクスチャデータを転送すれば、絵が変わります、
 *		しかしアニメーションの更新が起こるとビルボードアクターがテクスチャを
 *		更新してしまうので、元の絵に戻ってしまいます。
 *
 */
//-----------------------------------------------------------------------------
GLOBAL NNSGfdTexKey BLACT_GetTexKey( CONST_BLACT_WORK_PTR act );

//----------------------------------------------------------------------------
/**
 *
 *	@brief	パレットキーの取得
 *
 *	@param	act ビルボードアクターワーク
 *
 *	@retval	パレットキー
 *	@retval	BLACT_PLTTKEY_VRAMANM	ビルボードアクター初期化中
 *
 *	＊常駐アニメのときの注意点
 *		このVramアドレスにパレットデータを転送すれば、色が変わりますが、
 *		同じVramアドレスを見ているオブジェクトの色が全て変わってしまいます。
 *
 *	＊Vram転送アニメの時の注意点
 *		このVramアドレスにパレットデータを転送すれば、色が変わります、
 *		しかしパレットアニメするフレームがアニメーションにあるときは、
 *		ビルボードアクターがパレットを変更します。
 *		更新してしまうと、元の色に戻ってしまいます。
 *
 */
//-----------------------------------------------------------------------------
GLOBAL NNSGfdPlttKey BLACT_GetPlttKey( CONST_BLACT_WORK_PTR act );

//----------------------------------------------------------------------------
/**
 * ●常駐アニメーション用
 *
 *	@brief	テクスチャキーを設定する
 *
 *	@param	act		ビルボードアクターワーク
 *	@param	texkey	設定するテクスチャキー
 *
 *	@retval	TRUE	設定成功
 *	@retval	FALSE	設定失敗	（Vram転送アニメでは使用することが出来ないです）
 *
 *	これによりグラフィックデータを変更することが出来ます。
 *	ただし、元のグラフィックデータとテクスチャの構成（サイズ）が
 *	同じでないとちゃんとした絵がでません。
 *
 *	設定したtexKeyの解放は外側で管理してください。
 *
 */
//-----------------------------------------------------------------------------
GLOBAL BOOL BLACT_SetTexKey( BLACT_WORK_PTR act, const NNSGfdTexKey* texKey );

//----------------------------------------------------------------------------
/**
 * ●常駐アニメーション用
 *
 *	@brief	パレットキーを設定する
 *
 *	@param	act		ビルボードアクターワーク
 *	@param	plttkey	設定するパレットキー
 *
 *	@retval	TRUE	設定成功
 *	@retval	FALSE	設定失敗	（Vram転送では使用することが出来ないです）
 *
 *	これによりパレットを変更することが出来ます。
 *	ただし、元のパレットデータとパレットの構成（サイズ）が
 *	同じでないとちゃんとした絵がでません。
 *
 *	設定したplttKeyの解放は外側で管理してください。
 *
 */
//-----------------------------------------------------------------------------
GLOBAL BOOL BLACT_SetPlttKey( BLACT_WORK_PTR act, const NNSGfdPlttKey* plttKey );

//----------------------------------------------------------------------------
/**
 *	@brief	ビルボードアクターのカリングチェック
 *
 *	@param	act		アクター
 *
 *	@return	u32
 */
//-----------------------------------------------------------------------------
GLOBAL u32 BLACT_CullingCheck( BLACT_WORK_PTR act );

//----------------------------------------------------------------------------
/**
 *	@brief	Vram転送処理時、転送リクエスト
 *	@param	act		アクター
 *
 *	// BLACT_Drawの中でも転送しますが、
 *	// どうしても使用している側で転送するフレームを
 *	// 指定したいときもあるため作成
 *	// 初期かじなど
 */
//-----------------------------------------------------------------------------
GLOBAL void BLACT_VramAnmTransUserReq( BLACT_WORK_PTR act );

//--------------------------------------------------------------
/**
 * @brief	モデルリソースの取得
 * @param	act	BLACT_WORK_PTR
 * @retval	NNSG3dResMdl NNSG3dResMdl
 */
//--------------------------------------------------------------
GLOBAL NNSG3dResMdl * BLACT_ResMdlGet( BLACT_WORK_PTR act );

//--------------------------------------------------------------
/**
 * @brief	テクスチャリソースの取得
 * @param	act	BLACT_WORK_PTR
 * @retval	NNSG3dResTex NNSG3dResTex
 */
//--------------------------------------------------------------
GLOBAL NNSG3dResTex * BLACT_ResTexGet( BLACT_WORK_PTR act );

//--------------------------------------------------------------
/**
 * @brief	テクスチャリソースの取得
 * @param	act	BLACT_WORK_PTR
 * @retval	NNSG3dResTex NNSG3dResTex
 */
//--------------------------------------------------------------
GLOBAL NNSG3dResTex * BLACT_ResAnmTexGet( BLACT_WORK_PTR act );

//--------------------------------------------------------------
/**
 * @brief	レンダーOBJの取得
 * @param	act	BLACT_WORK_PTR
 * @retval	NNSG3dRenderObj	NNSG3dRenderObj
 */
//--------------------------------------------------------------
GLOBAL NNSG3dRenderObj * BLACT_RenderObjGet( BLACT_WORK_PTR act );

//--------------------------------------------------------------
/**
 * @brief	描画前に呼ぶ関数を登録
 * @param	act		BLACT_WORK_PTR
 * @param	proc	登録するBLACT_DRAW_BEFORE_PROC。NULL=登録無し
 * @param	work	procの引数に指定する任意のワークポインタ
 * @retval	nothing
 */
//--------------------------------------------------------------
GLOBAL void BLACT_DrawBeforeProcSet( BLACT_WORK_PTR act, BLACT_DRAW_BEFORE_PROC proc, void *work );

#undef	GLOBAL
#endif		// __BLACT_H__